package com.dingwen.treasure.kettle.base.controller;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.dingwen.treasure.kettle.base.vo.Result;
import com.dingwen.treasure.kettle.base.vo.ResultGenerator;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;

import java.beans.PropertyEditorSupport;
import java.util.Date;

/**
 * 基础视图接口
 *
 * @author dingwen
 * @date 2023/2/18 17:16
 */
public interface BaseViewController {

    /**
     * 自定义参数转换： 转换前端类型的转换(反序列化)
     *
     * @param webDataBinder web数据绑定器
     */
    @InitBinder
    default void initBinder(WebDataBinder webDataBinder) {
        // Date 类型转换
        webDataBinder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            @Override
            public void setAsText(String text) {
                setValue(DateUtil.parseDate(text));
            }
        });
    }

    /**
     * url重定向
     *
     * @param url url
     * @return {@link String}
     */
    default String redirect(String url) {
        return StrUtil.format("redirect:{}", url);
    }



    /* --------------------------------------------通用返回封装--------------------------------------------*/

    /**
     * 成功
     *
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success() {
        return ResultGenerator.genSuccessResult();
    }

    /**
     * 成功
     *
     * @param message 消息
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success(String message) {
        return ResultGenerator.genSuccessResultOnlyMessage(message);
    }

    /**
     * 成功
     *
     * @param data    数据
     * @param strData 是否返回数据：true:返回数据 false:返回消息
     * @return {@link Result}<{@link String}>
     */
    default Result<String> success(String data, boolean strData) {
        return strData ? ResultGenerator.genSuccessResult(data) : success(data);
    }

    /**
     * 成功
     *
     * @param data 数据
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success(T data) {
        return ResultGenerator.genSuccessResult(data);
    }

    /**
     * 成功
     *
     * @param data    数据
     * @param message 消息
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success(T data, String message) {
        return ResultGenerator.genSuccessResult(data, message);
    }


    /**
     * 成功
     *
     * @param row 受影响行数
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success(Integer row) {
        return ResultGenerator.genResult(row);
    }

    /**
     * 成功
     *
     * @param resultFlag 是否成功标志
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> success(boolean resultFlag) {
        return ResultGenerator.genResult(resultFlag);
    }


    /**
     * 失败
     *
     * @param message 消息
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> failure(String message) {
        return ResultGenerator.genFailureResult(message);
    }

    /**
     * 失败
     *
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> failure() {
        return ResultGenerator.genSuccessResult();
    }

    /**
     * 失败
     *
     * @param message    消息
     * @param httpStatus http状态
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> failure(String message, Integer httpStatus) {
        return ResultGenerator.genFailureResult(message, httpStatus);
    }

    /**
     * 失败
     *
     * @param message 消息
     * @param t       t 数据
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> failure(String message, T t) {
        return ResultGenerator.genFailureResult(message, t);
    }

    /**
     * 失败
     *
     * @param message    消息
     * @param httpStatus http状态
     * @param t          t 数据
     * @return {@link Result}<{@link T}>
     */
    default <T> Result<T> failure(String message, Integer httpStatus, T t) {
        return ResultGenerator.genFailureResult(message, httpStatus, t);
    }
}
